/*
 * measure1.h
 *
 *  Created on: 2016年6月13日
 *      Author: guyadong
 */

#ifndef FACEDETECT_MEASURE_H_
#define FACEDETECT_MEASURE_H_
#include <vector>
namespace gdface {

/*
 * 检测尺度对象，管理所有检测窗口相关数据
 */
struct measure {
	size_t min_detect_win_size;	// 最小检测窗口
	float step;					// 基于检测窗口min_detect_win_size的放大倍率
	float log_step;				// step的自然对数常量
	std::vector<size_t> detect_win_size;		// 所有支持的检测窗口的尺寸(从小到大)
	std::vector<size_t> detect_win_pixels_sum;	// 所有支持的检测窗口的面积(从小到大)
	std::vector<float>  scale_ratio;			// 所有支持的检测窗口基于min_detect_win_size放大分辨率(从小到大)
	measure();
	measure(size_t min_detect_win_size, float step, size_t scale_size);
	/* 允许复制构造函数 */
	measure(const measure& )=default;
	/* 允许移动复制构造函数 */
	measure(measure&& )=default;
	/* 允许赋值操作符 */
	measure& operator=(const measure&)=default;
	/* 允许移动赋值操作符 */
	measure& operator=(measure&&)=default;
	/*
	* 根据索引值获取检测窗口尺寸，如果索引值超过detect_win_size容量
	* 则使用放大公式计算对应的窗口尺寸
	* */
	size_t get_detect_win_size_by_index(size_t index) const;
	size_t operator [](size_t index);
	/*
	* 返回数组detect_win_size中第一个>=size的值的索引
	* */
	int index_of_measure_floor(size_t s) const;
	/*
	* 返回数组detect_win_size中第一个<=size的值的索引
	* */
	int index_of_measure_ceil(size_t s) const;
};
/* 尺度对象全局变量 */
extern const measure global_measure;
void init_global_measure(size_t scale_size, float step, size_t min_detect_win_size);
} /* namespace gdface */

#endif /* FACEDETECT_MEASURE_H_ */
